package com.efrei.schoolmanager.views;

import javax.swing.SwingUtilities;

import org.hibernate.HibernateException;

import com.efrei.schoolmanager.controlers.ControleurTransactionnel;
import com.efrei.schoolmanager.exceptions.LogicException;
import com.efrei.schoolmanager.tools.Tools;

/**
 * Appel de l'action specifique si indiqué puis validAndQuit. <br/>
 * Affiche les erreurs à l'utilisateur et efface l'ecran dans tous les cas
 */
public class ControlerValidator implements Runnable {

	private final ControleurTransactionnel controleur;
	private final VueGenerale vue;
	private Runnable specificAction;

	public ControlerValidator(ControleurTransactionnel controleur,
			VueGenerale vue) {
		this.controleur = controleur;
		this.vue = vue;
	}

	public ControlerValidator(ControleurTransactionnel controleur,
			VueGenerale vue, Runnable specificAction) {
		this.vue = vue;
		this.controleur = controleur;
		this.specificAction = specificAction;
	}

	@Override
	public void run() {
		if (specificAction != null)
			specificAction.run();

		// Debut validation
		try {
			controleur.validAndQuit();
		} catch (LogicException e) {
			System.err.println(e.getMessage());
		} catch (HibernateException e2) {
			e2.printStackTrace();
			error("Erreur avec la base, verifiez la connexion et réessayez");
		} catch (Exception e3) {
			e3.printStackTrace();
			error("Erreur inconnue, réessayez");
		}
		// On nettoie l'ecran
		SwingUtilities.invokeLater(new Runnable() {
			@Override
			public void run() {
				// Arret de l'attente
				vue.stopBarreChargement();
				// On supprime finalement l'affichage
				vue.removePanel();
			}
		});
	}

	/**
	 * Affiche le message d'erreur a l'utilisateur via une popup
	 * 
	 * @param message
	 */
	public void error(final String message) {
		try {
			SwingUtilities.invokeAndWait(new Runnable() {
				@Override
				public void run() {
					Tools.displayError(message, "Erreur durant la validation");
				}
			});
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
